//compose 组合 可以将多个函数进行组合
//函数的返回结果是下一个函数的输入，就可以使用compose方法
function sum(a, b, c) {
  return a + b + c;
}

function len(str){
  return str.length;
}

function addTag(str){
  return '$' + str;
}
// let r = addTag(len(sum('a', 'b', 'c')));
// console.log(r) //$3

/** 写法1*/
/*function compose(...fns){
  return function(...args){
    let lastFn = fns.pop();
    return fns.reduceRight((prev, current) => {
      //TODO 函数的返回结果是下一个函数的输入，就可以使用compose方法 ← 记住这句话 关键！！
      return current(prev);
    },lastFn(...args));
  }
}
console.log(compose(addTag, len, sum)('a', 'b', 'c')); //$3*/


/** 写法2*/
/*function compose(...fns){
  return fns.reduce((prev, next, index, current) => {
    return function(...args){
      return prev(next(...args))
    }
  });
}*/
const compose = (...fns) => fns.reduce((a, b, index, current) => (...args) => a(b(...args)));
console.log(compose(addTag, len, sum)('a', 'b', 'c')); //$3
